package com.jzcn.common.response;


import com.jzcn.common.constants.UserConstants;


/**
 * API 统一返回状态码
 *
 * @author peng.l
 * @version 0.0.1
 */
public enum ResponseCode {
    UNKNOWN(00000, "未知异常"),

    /**
     * 请求成功
     */
    SUCCESS(200, "成功"),
    /**
     * 请求失败
     */
    FAILURE(202, "失败"),

    // ------------------------------------------------------- 参数错误：10001-19999 Start

    /**
     * 参数无效
     */
    PARAM_IS_INVALID(101, "参数无效"),
    /**
     * 参数为空
     */
    PARAM_IS_BLANK(102, "参数为空"),
    /**
     * 参数类型错误
     */
    PARAM_TYPE_BIND_ERROR(103, "参数类型错误"),
    /**
     * 参数缺失
     */
    PARAM_NOT_COMPLETE(104, "参数缺失"),
    /**
     * 参数验证失败
     */
    VALIDATE_FAILED(005, "参数验证失败"),

    PARAM_USERNAME_IS_BLANK(106, "用户名不能为空"),

    PARAM_PWD_IS_BLANK(007, "密码不能为空"),

    VALIDATE_USERNAME_LEGNTH_FAILED(108, String.format("用户名长度应为%s-%s位", UserConstants.USERNAME_MIN_LENGTH, UserConstants.USERNAME_MAX_LENGTH)),
    VALIDATE_PWD_LEGNTH_FAILED(10009, String.format("密码长度应为%s-%s位", UserConstants.PASSWORD_MIN_LENGTH, UserConstants.PASSWORD_MAX_LENGTH)),


    // ------------------------------------------------------- 参数错误：10001-19999 End

    // ------------------------------------------------------- 用户错误：20001-29999 Start

    /**
     * 用户未登录
     */
    USER_NOT_LOGGED_IN(201, "用户未登录"),
    /**
     * 账号不存在或密码错误
     */
    USER_LOGIN_ERROR(202, "账号不存在或密码错误"),
    /**
     * 账号已被禁用
     */
    USER_ACCOUNT_FORBIDDEN(203, "账号已被禁用"),
    /**
     * 用户不存在
     */
    USER_NOT_EXIST(204, "用户不存在"),
    /**
     * 用户已存在
     */
    USER_HAS_EXISTED(205, "用户已存在"),

    /**
     * 账户锁定
     */
    USER_IS_LOCK(206, "账户锁定"),

    /**
     * 账户锁定
     */
    USER_PWD_ERROR(207, "密码错误"),

    // ------------------------------------------------------- 用户错误：20001-29999 End

    // ------------------------------------------------------- 业务错误：30001-39999 Start

    /**
     * 业务系统中用户不存在
     */
    SPECIFIED_QUESTIONED_USER_NOT_EXIST(301, "业务系统中用户不存在"),
    USER_NICK_HAS_EXISTED(302, "昵称已存在"),
    USER_EMAIL_HAS_EXISTED(303, "邮箱已存在"),

    // ------------------------------------------------------- 业务错误：30001-39999 End

    // ------------------------------------------------------- 系统错误：40001-49999 Start

    /**
     * 系统繁忙，请稍后重试
     */
    SYSTEM_INNER_ERROR(401, "系统繁忙，请稍后重试"),

    /**
     * 系统繁忙，请稍后重试
     */
    SYSTEM_QU_ERROR(402, "频繁操作"),

    // ------------------------------------------------------- 系统错误：40001-49999 End

    // ------------------------------------------------------- 数据错误：50001-599999 Start

    /**
     * 数据未找到
     */
    RESULT_DATA_NONE(501, "数据未找到"),
    /**
     * 数据有误
     */
    DATA_IS_WRONG(502, "数据有误"),
    /**
     * 数据已存在
     */
    DATA_ALREADY_EXISTED(503, "数据已存在"),

    // ------------------------------------------------------- 数据错误：50001-599999 End

    // ------------------------------------------------------- 接口错误：60001-69999 Start

    /**
     * 内部系统接口调用异常
     */
    INTERFACE_INNER_INVOKE_ERROR(601, "内部系统接口调用异常"),
    /**
     * 外部系统接口调用异常
     */
    INTERFACE_OUTER_INVOKE_ERROR(602, "外部系统接口调用异常"),
    /**
     * 该接口禁止访问
     */
    INTERFACE_FORBID_VISIT(603, "该接口禁止访问"),
    /**
     * 接口地址无效
     */
    INTERFACE_ADDRESS_INVALID(604, "接口地址无效"),
    /**
     * 接口请求超时
     */
    INTERFACE_REQUEST_TIMEOUT(605, "接口请求超时"),
    /**
     * 接口负载过高
     */
    INTERFACE_EXCEED_LOAD(606, "接口负载过高"),

    // ------------------------------------------------------- 接口错误：60001-69999 End

    // ------------------------------------------------------- 权限错误：70001-79999 Start

    /**
     * 无访问权限
     */
    PERMISSION_NO_ACCESS(701, "无访问权限");

    // ------------------------------------------------------- 权限错误：70001-79999 End

    private Integer code;

    private String message;

    ResponseCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer code() {
        return this.code;
    }

    public String message() {
        return this.message;
    }

    public static String getMessage(String name) {
        for (ResponseCode item : ResponseCode.values()) {
            if (item.name().equals(name)) {
                return item.message;
            }
        }
        return name;
    }

    public static Integer getCode(String name) {
        for (ResponseCode item : ResponseCode.values()) {
            if (item.name().equals(name)) {
                return item.code;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return this.name();
    }

}
